# 初始化变量
dp = [[0] * 25 for _ in range(25)]
s = [[False] * 25 for _ in range(25)]
# 输入坐标
bx, by, mx, my = map(int, input().split())
# 坐标加2防止越界，不会出现负数坐标
bx += 2
by += 2
mx += 2
my += 2
# 初始化起点
# 如果起点设置为 dp[2][2] = 1，那么在计算 dp[2][2] 时，需要访问 dp[1][2] 和 dp[2][1]，而 dp[1][2] 是无效的。
# 通过将起点设置为 dp[2][1] = 1，可以确保 dp[2][2] 的计算正确。
dp[2][1] = 1
# 标记马的控制点
s[mx][my] = True
s[mx-2][my-1] = True
s[mx-2][my+1] = True
s[mx+2][my-1] = True
s[mx+2][my+1] = True
s[mx-1][my+2] = True
s[mx-1][my-2] = True
s[mx+1][my+2] = True
s[mx+1][my-2] = True
# 动态规划计算路径数
for i in range(2, bx + 1):
    for j in range(2, by + 1):
        if s[i][j]:
            dp[i][j] = 0  # 控制点不能走
        else:
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
print(dp[bx][by])
